home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / lib / python2.5 / site-packages / pythonscript.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-29  |  35KB  |  915 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. import uno
  5. import unohelper
  6. import sys
  7. import os
  8. import imp
  9. import time
  10.  
  11. class LogLevel:
  12.     NONE = 0
  13.     ERROR = 1
  14.     DEBUG = 2
  15.  
  16. LogLevel.use = LogLevel.NONE
  17. LOG_STDOUT = True
  18. ENABLE_EDIT_DIALOG = False
  19.  
  20. def encfile(uni):
  21.     return uni.encode(sys.getfilesystemencoding())
  22.  
  23.  
  24. def lastException2String():
  25.     (excType, excInstance, excTraceback) = sys.exc_info()
  26.     ret = str(excType) + ': ' + str(excInstance) + '\n' + uno._uno_extract_printable_stacktrace(excTraceback)
  27.     return ret
  28.  
  29.  
  30. def logLevel2String(level):
  31.     ret = ' NONE'
  32.     if level == LogLevel.ERROR:
  33.         ret = 'ERROR'
  34.     elif level >= LogLevel.DEBUG:
  35.         ret = 'DEBUG'
  36.     
  37.     return ret
  38.  
  39.  
  40. def getLogTarget():
  41.     ret = sys.stdout
  42.     if not LOG_STDOUT:
  43.         
  44.         try:
  45.             pathSubst = uno.getComponentContext().ServiceManager.createInstance('com.sun.star.util.PathSubstitution')
  46.             userInstallation = pathSubst.getSubstituteVariableValue('user')
  47.             if len(userInstallation) > 0:
  48.                 systemPath = uno.fileUrlToSystemPath(userInstallation + '/Scripts/python/log.txt')
  49.                 ret = file(systemPath, 'a')
  50.         except Exception:
  51.             e = None
  52.             print 'Exception during creation of pythonscript logfile: ' + lastException2String() + '\n, delagating log to stdout\n'
  53.         except:
  54.             None<EXCEPTION MATCH>Exception
  55.         
  56.  
  57.     None<EXCEPTION MATCH>Exception
  58.     return ret
  59.  
  60.  
  61. class Logger(LogLevel):
  62.     
  63.     def __init__(self, target):
  64.         self.target = target
  65.  
  66.     
  67.     def isDebugLevel(self):
  68.         return self.use >= self.DEBUG
  69.  
  70.     
  71.     def debug(self, msg):
  72.         if self.isDebugLevel():
  73.             self.log(self.DEBUG, msg)
  74.         
  75.  
  76.     
  77.     def isErrorLevel(self):
  78.         return self.use >= self.ERROR
  79.  
  80.     
  81.     def error(self, msg):
  82.         if self.isErrorLevel():
  83.             self.log(self.ERROR, msg)
  84.         
  85.  
  86.     
  87.     def log(self, level, msg):
  88.         if self.use >= level:
  89.             
  90.             try:
  91.                 self.target.write(time.asctime() + ' [' + logLevel2String(level) + '] ' + encfile(msg) + '\n')
  92.                 self.target.flush()
  93.             except Exception:
  94.                 e = None
  95.                 print 'Error during writing to stdout: ' + lastException2String() + '\n'
  96.             except:
  97.                 None<EXCEPTION MATCH>Exception
  98.             
  99.  
  100.         None<EXCEPTION MATCH>Exception
  101.  
  102.  
  103. log = Logger(getLogTarget())
  104. log.debug('pythonscript loading')
  105. from com.sun.star.uno import RuntimeException
  106. from com.sun.star.lang import XServiceInfo
  107. from com.sun.star.io import IOException
  108. from com.sun.star.ucb import CommandAbortedException
  109. from com.sun.star.beans import XPropertySet
  110. from com.sun.star.container import XNameContainer
  111. from com.sun.star.xml.sax import XDocumentHandler, InputSource
  112. from com.sun.star.uno import Exception as UnoException
  113. from com.sun.star.script import XInvocation
  114. from com.sun.star.awt import XActionListener
  115. from com.sun.star.script.provider import XScriptProvider, XScript, XScriptContext, ScriptFrameworkErrorException
  116. from com.sun.star.script.browse import XBrowseNode
  117. from com.sun.star.script.browse.BrowseNodeTypes import SCRIPT, CONTAINER, ROOT
  118. LANGUAGENAME = 'Python'
  119. GLOBAL_SCRIPTCONTEXT_NAME = 'XSCRIPTCONTEXT'
  120. CALLABLE_CONTAINER_NAME = 'g_exportedScripts'
  121. g_ImplementationHelper = unohelper.ImplementationHelper()
  122. g_implName = 'org.openoffice.pyuno.LanguageScriptProviderFor' + LANGUAGENAME
  123. BLOCK_SIZE = 65536
  124.  
  125. def readTextFromStream(inputStream):
  126.     code = uno.ByteSequence('')
  127.     while True:
  128.         (read, out) = inputStream.readBytes(None, BLOCK_SIZE)
  129.         code = code + out
  130.         if read < BLOCK_SIZE:
  131.             break
  132.             continue
  133.     return code.value
  134.  
  135.  
  136. class ModuleEntry:
  137.     
  138.     def __init__(self, lastRead, module):
  139.         self.lastRead = lastRead
  140.         self.module = module
  141.  
  142.  
  143.  
  144. def hasChanged(oldDate, newDate):
  145.     if not newDate.Year > oldDate.Year and newDate.Month > oldDate.Month and newDate.Day > oldDate.Day and newDate.Hours > oldDate.Hours and newDate.Minutes > oldDate.Minutes and newDate.Seconds > oldDate.Seconds:
  146.         pass
  147.     return newDate.HundredthSeconds > oldDate.HundredthSeconds
  148.  
  149.  
  150. def ensureSourceState(code):
  151.     if not code.endswith('\n'):
  152.         code = code + '\n'
  153.     
  154.     code = code.replace('\r', '')
  155.     return code
  156.  
  157.  
  158. def checkForPythonPathBesideScript(url):
  159.     if url.startswith('file:'):
  160.         path = unohelper.fileUrlToSystemPath(url + '/pythonpath.zip')
  161.         log.log(LogLevel.DEBUG, 'checking for existence of ' + path)
  162.         if 1 == os.access(encfile(path), os.F_OK) and path not in sys.path:
  163.             log.log(LogLevel.DEBUG, 'adding ' + path + ' to sys.path')
  164.             sys.path.append(path)
  165.         
  166.         path = unohelper.fileUrlToSystemPath(url + '/pythonpath')
  167.         log.log(LogLevel.DEBUG, 'checking for existence of ' + path)
  168.         if 1 == os.access(encfile(path), os.F_OK) and path not in sys.path:
  169.             log.log(LogLevel.DEBUG, 'adding ' + path + ' to sys.path')
  170.             sys.path.append(path)
  171.         
  172.     
  173.  
  174.  
  175. class ScriptContext(unohelper.Base):
  176.     
  177.     def __init__(self, ctx, doc):
  178.         self.ctx = ctx
  179.         self.doc = doc
  180.  
  181.     
  182.     def getDocument(self):
  183.         return self.getDesktop().getCurrentComponent()
  184.  
  185.     
  186.     def getDesktop(self):
  187.         return self.ctx.ServiceManager.createInstanceWithContext('com.sun.star.frame.Desktop', self.ctx)
  188.  
  189.     
  190.     def getComponentContext(self):
  191.         return self.ctx
  192.  
  193.  
  194.  
  195. class ProviderContext:
  196.     
  197.     def __init__(self, storageType, sfa, uriHelper, scriptContext):
  198.         self.storageType = storageType
  199.         self.sfa = sfa
  200.         self.uriHelper = uriHelper
  201.         self.scriptContext = scriptContext
  202.         self.modules = { }
  203.         self.rootUrl = None
  204.         self.mapPackageName2Path = None
  205.  
  206.     
  207.     def getTransientPartFromUrl(self, url):
  208.         rest = url.replace(self.rootUrl, '', 1).replace('/', '', 1)
  209.         return rest[0:rest.find('/')]
  210.  
  211.     
  212.     def getPackageNameFromUrl(self, url):
  213.         rest = url.replace(self.rootUrl, '', 1).replace('/', '', 1)
  214.         start = rest.find('/') + 1
  215.         return rest[start:rest.find('/', start)]
  216.  
  217.     
  218.     def removePackageByUrl(self, url):
  219.         items = self.mapPackageName2Path.items()
  220.         for i in items:
  221.             if url in i[1].pathes:
  222.                 self.mapPackageName2Path.pop(i[0])
  223.                 break
  224.                 continue
  225.         
  226.  
  227.     
  228.     def addPackageByUrl(self, url):
  229.         packageName = self.getPackageNameFromUrl(url)
  230.         transientPart = self.getTransientPartFromUrl(url)
  231.         if log.isDebugLevel():
  232.             pass
  233.         log.debug('addPackageByUrl : ' + packageName + ', ' + transientPart)
  234.         if self.mapPackageName2Path.has_key(packageName):
  235.             package = self.mapPackageName2Path[packageName]
  236.             package.pathes = package.pathes + (url,)
  237.         else:
  238.             package = Package((url,), transientPart)
  239.             self.mapPackageName2Path[packageName] = package
  240.  
  241.     
  242.     def isUrlInPackage(self, url):
  243.         values = self.mapPackageName2Path.values()
  244.         for i in values:
  245.             if url in i.pathes:
  246.                 return True
  247.                 continue
  248.         
  249.         return False
  250.  
  251.     
  252.     def setPackageAttributes(self, mapPackageName2Path, rootUrl):
  253.         self.mapPackageName2Path = mapPackageName2Path
  254.         self.rootUrl = rootUrl
  255.  
  256.     
  257.     def getPersistentUrlFromStorageUrl(self, url):
  258.         ret = url
  259.         if self.rootUrl:
  260.             pos = len(self.rootUrl) + 1
  261.             ret = url[0:pos] + url[url.find('/', pos) + 1:len(url)]
  262.         
  263.         if log.isDebugLevel():
  264.             pass
  265.         log.debug('getPersistentUrlFromStorageUrl ' + url + ' -> ' + ret)
  266.         return ret
  267.  
  268.     
  269.     def getStorageUrlFromPersistentUrl(self, url):
  270.         ret = url
  271.         if self.rootUrl:
  272.             pos = len(self.rootUrl) + 1
  273.             packageName = url[pos:url.find('/', pos + 1)]
  274.             package = self.mapPackageName2Path[packageName]
  275.             ret = url[0:pos] + package.transientPathElement + '/' + url[pos:len(url)]
  276.         
  277.         if log.isDebugLevel():
  278.             pass
  279.         log.debug('getStorageUrlFromPersistentUrl ' + url + ' -> ' + ret)
  280.         return ret
  281.  
  282.     
  283.     def getModuleByUrl(self, url):
  284.         entry = self.modules.get(url)
  285.         load = True
  286.         lastRead = self.sfa.getDateTimeModified(url)
  287.         if entry:
  288.             if hasChanged(entry.lastRead, lastRead):
  289.                 if log.isDebugLevel():
  290.                     pass
  291.                 log.debug('file ' + url + ' has changed, reloading')
  292.             else:
  293.                 load = False
  294.         
  295.         if load:
  296.             if log.isDebugLevel():
  297.                 pass
  298.             log.debug('opening >' + url + '<')
  299.             src = readTextFromStream(self.sfa.openFileRead(url))
  300.             checkForPythonPathBesideScript(url[0:url.rfind('/')])
  301.             src = ensureSourceState(src)
  302.             entry = ModuleEntry(lastRead, imp.new_module('ooo_script_framework'))
  303.             entry.module.__dict__[GLOBAL_SCRIPTCONTEXT_NAME] = self.scriptContext
  304.             code = None
  305.             if url.startswith('file:'):
  306.                 code = compile(src, encfile(uno.fileUrlToSystemPath(url)), 'exec')
  307.             else:
  308.                 code = compile(src, url, 'exec')
  309.             exec code in entry.module.__dict__
  310.             entry.module.__file__ = url
  311.             self.modules[url] = entry
  312.             if log.isDebugLevel():
  313.                 pass
  314.             log.debug('mapped ' + url + ' to ' + str(entry.module))
  315.         
  316.         return entry.module
  317.  
  318.  
  319.  
  320. def isScript(candidate):
  321.     ret = False
  322.     if isinstance(candidate, type(isScript)):
  323.         ret = True
  324.     
  325.     return ret
  326.  
  327.  
  328. class ScriptBrowseNode(unohelper.Base, XBrowseNode, XPropertySet, XInvocation, XActionListener):
  329.     
  330.     def __init__(self, provCtx, uri, fileName, funcName, func):
  331.         self.fileName = fileName
  332.         self.funcName = funcName
  333.         self.provCtx = provCtx
  334.         self.func = func
  335.         self.uri = uri
  336.  
  337.     
  338.     def getName(self):
  339.         return self.funcName
  340.  
  341.     
  342.     def getChildNodes(self):
  343.         return ()
  344.  
  345.     
  346.     def hasChildNodes(self):
  347.         return False
  348.  
  349.     
  350.     def getType(self):
  351.         return SCRIPT
  352.  
  353.     
  354.     def getPropertyValue(self, name):
  355.         ret = None
  356.         if name == 'URI':
  357.             ret = self.provCtx.uriHelper.getScriptURI(self.provCtx.getPersistentUrlFromStorageUrl(self.uri + '$' + self.funcName))
  358.         elif name == 'Description':
  359.             ret = getattr(self.func, '__doc__', None)
  360.         elif name == 'Editable' and ENABLE_EDIT_DIALOG:
  361.             ret = not self.provCtx.sfa.isReadOnly(self.uri)
  362.         
  363.         if log.isDebugLevel():
  364.             pass
  365.         log.debug('ScriptBrowseNode.getPropertyValue called for ' + name + ', returning ' + str(ret))
  366.         return ret
  367.  
  368.     
  369.     def setPropertyValue(self, name, value):
  370.         if log.isDebugLevel():
  371.             pass
  372.         log.debug('ScriptBrowseNode.setPropertyValue called ' + name + '=' + str(value))
  373.  
  374.     
  375.     def getPropertySetInfo(self):
  376.         if log.isDebugLevel():
  377.             pass
  378.         log.debug('ScriptBrowseNode.getPropertySetInfo called ')
  379.  
  380.     
  381.     def getIntrospection(self):
  382.         pass
  383.  
  384.     
  385.     def invoke(self, name, params, outparamindex, outparams):
  386.         if name == 'Editable':
  387.             servicename = 'com.sun.star.awt.DialogProvider'
  388.             ctx = self.provCtx.scriptContext.getComponentContext()
  389.             dlgprov = ctx.ServiceManager.createInstanceWithContext(servicename, ctx)
  390.             self.editor = dlgprov.createDialog('vnd.sun.star.script:' + 'ScriptBindingLibrary.MacroEditor?location=application')
  391.             code = readTextFromStream(self.provCtx.sfa.openFileRead(self.uri))
  392.             code = ensureSourceState(code)
  393.             self.editor.getControl('EditorTextField').setText(code)
  394.             self.editor.getControl('RunButton').setActionCommand('Run')
  395.             self.editor.getControl('RunButton').addActionListener(self)
  396.             self.editor.getControl('SaveButton').setActionCommand('Save')
  397.             self.editor.getControl('SaveButton').addActionListener(self)
  398.             self.editor.execute()
  399.         
  400.  
  401.     
  402.     def actionPerformed(self, event):
  403.         
  404.         try:
  405.             if event.ActionCommand == 'Run':
  406.                 code = self.editor.getControl('EditorTextField').getText()
  407.                 code = ensureSourceState(code)
  408.                 mod = imp.new_module('ooo_script_framework')
  409.                 mod.__dict__[GLOBAL_SCRIPTCONTEXT_NAME] = self.provCtx.scriptContext
  410.                 exec code in mod.__dict__
  411.                 values = mod.__dict__.get(CALLABLE_CONTAINER_NAME, None)
  412.                 if not values:
  413.                     values = mod.__dict__.values()
  414.                 
  415.                 for i in values:
  416.                     if isScript(i):
  417.                         i()
  418.                         break
  419.                         continue
  420.                 
  421.             elif event.ActionCommand == 'Save':
  422.                 toWrite = uno.ByteSequence(str(self.editor.getControl('EditorTextField').getText().encode(sys.getdefaultencoding())))
  423.                 copyUrl = self.uri + '.orig'
  424.                 self.provCtx.sfa.move(self.uri, copyUrl)
  425.                 out = self.provCtx.sfa.openFileWrite(self.uri)
  426.                 out.writeBytes(toWrite)
  427.                 out.close()
  428.                 self.provCtx.sfa.kill(copyUrl)
  429.         except Exception:
  430.             e = None
  431.             log.error(lastException2String())
  432.  
  433.  
  434.     
  435.     def setValue(self, name, value):
  436.         pass
  437.  
  438.     
  439.     def getValue(self, name):
  440.         pass
  441.  
  442.     
  443.     def hasMethod(self, name):
  444.         return False
  445.  
  446.     
  447.     def hasProperty(self, name):
  448.         return False
  449.  
  450.  
  451.  
  452. class FileBrowseNode(unohelper.Base, XBrowseNode):
  453.     
  454.     def __init__(self, provCtx, uri, name):
  455.         self.provCtx = provCtx
  456.         self.uri = uri
  457.         self.name = name
  458.         self.module = None
  459.  
  460.     
  461.     def getName(self):
  462.         return self.name
  463.  
  464.     
  465.     def getChildNodes(self):
  466.         ret = ()
  467.         
  468.         try:
  469.             self.module = self.provCtx.getModuleByUrl(self.uri)
  470.             values = self.module.__dict__.get(CALLABLE_CONTAINER_NAME, None)
  471.             if not isinstance(values, type(())):
  472.                 values = self.module.__dict__.values()
  473.             
  474.             scriptNodeList = []
  475.             for i in values:
  476.                 if isScript(i):
  477.                     scriptNodeList.append(ScriptBrowseNode(self.provCtx, self.uri, self.name, i.__name__, i))
  478.                     continue
  479.             
  480.             ret = tuple(scriptNodeList)
  481.             if log.isDebugLevel():
  482.                 pass
  483.             log.debug('returning ' + str(len(ret)) + ' ScriptChildNodes on ' + self.uri)
  484.         except Exception:
  485.             e = None
  486.             text = lastException2String()
  487.             log.error('Error while evaluating ' + self.uri + ':' + text)
  488.             raise 
  489.  
  490.         return ret
  491.  
  492.     
  493.     def hasChildNodes(self):
  494.         
  495.         try:
  496.             return len(self.getChildNodes()) > 0
  497.         except Exception:
  498.             e = None
  499.             return False
  500.  
  501.  
  502.     
  503.     def getType(self):
  504.         return CONTAINER
  505.  
  506.  
  507.  
  508. class DirBrowseNode(unohelper.Base, XBrowseNode):
  509.     
  510.     def __init__(self, provCtx, name, rootUrl):
  511.         self.provCtx = provCtx
  512.         self.name = name
  513.         self.rootUrl = rootUrl
  514.  
  515.     
  516.     def getName(self):
  517.         return self.name
  518.  
  519.     
  520.     def getChildNodes(self):
  521.         
  522.         try:
  523.             if log.isDebugLevel():
  524.                 pass
  525.             log.debug('DirBrowseNode.getChildNodes called for ' + self.rootUrl)
  526.             contents = self.provCtx.sfa.getFolderContents(self.rootUrl, True)
  527.             browseNodeList = []
  528.             for i in contents:
  529.                 if i.endswith('.py'):
  530.                     if log.isDebugLevel():
  531.                         pass
  532.                     log.debug('adding filenode ' + i)
  533.                     browseNodeList.append(FileBrowseNode(self.provCtx, i, i[i.rfind('/') + 1:len(i) - 3]))
  534.                     continue
  535.                 if self.provCtx.sfa.isFolder(i) and not i.endswith('/pythonpath'):
  536.                     if log.isDebugLevel():
  537.                         pass
  538.                     log.debug('adding DirBrowseNode ' + i)
  539.                     browseNodeList.append(DirBrowseNode(self.provCtx, i[i.rfind('/') + 1:len(i)], i))
  540.                     continue
  541.             
  542.             return tuple(browseNodeList)
  543.         except Exception:
  544.             e = None
  545.             text = lastException2String()
  546.             log.error('DirBrowseNode error: ' + str(e) + ' while evaluating ' + self.rootUrl)
  547.             log.error(text)
  548.             return ()
  549.  
  550.  
  551.     
  552.     def hasChildNodes(self):
  553.         return True
  554.  
  555.     
  556.     def getType(self):
  557.         return CONTAINER
  558.  
  559.     
  560.     def getScript(self, uri):
  561.         log.debug('DirBrowseNode getScript ' + uri + ' invoked')
  562.         raise IllegalArgumentException("DirBrowseNode couldn't instantiate script " + uri, self, 0)
  563.  
  564.  
  565.  
  566. class ManifestHandler(XDocumentHandler, unohelper.Base):
  567.     
  568.     def __init__(self, rootUrl):
  569.         self.rootUrl = rootUrl
  570.  
  571.     
  572.     def startDocument(self):
  573.         self.urlList = []
  574.  
  575.     
  576.     def endDocument(self):
  577.         pass
  578.  
  579.     
  580.     def startElement(self, name, attlist):
  581.         if name == 'manifest:file-entry':
  582.             if attlist.getValueByName('manifest:media-type') == 'application/vnd.sun.star.framework-script':
  583.                 self.urlList.append(self.rootUrl + '/' + attlist.getValueByName('manifest:full-path'))
  584.             
  585.         
  586.  
  587.     
  588.     def endElement(self, name):
  589.         pass
  590.  
  591.     
  592.     def characters(self, chars):
  593.         pass
  594.  
  595.     
  596.     def ignoreableWhitespace(self, chars):
  597.         pass
  598.  
  599.     
  600.     def setDocumentLocator(self, locator):
  601.         pass
  602.  
  603.  
  604.  
  605. def getPathesFromPackage(rootUrl, sfa):
  606.     ret = ()
  607.     
  608.     try:
  609.         fileUrl = rootUrl + '/META-INF/manifest.xml'
  610.         inputStream = sfa.openFileRead(fileUrl)
  611.         parser = uno.getComponentContext().ServiceManager.createInstance('com.sun.star.xml.sax.Parser')
  612.         handler = ManifestHandler(rootUrl)
  613.         parser.setDocumentHandler(handler)
  614.         parser.parseStream(InputSource(inputStream, '', fileUrl, fileUrl))
  615.         ret = tuple(handler.urlList)
  616.     except UnoException:
  617.         e = None
  618.         text = lastException2String()
  619.         log.debug('getPathesFromPackage ' + fileUrl + ' Exception: ' + text)
  620.  
  621.     return ret
  622.  
  623.  
  624. class Package:
  625.     
  626.     def __init__(self, pathes, transientPathElement):
  627.         self.pathes = pathes
  628.         self.transientPathElement = transientPathElement
  629.  
  630.  
  631.  
  632. def getPackageName2PathMap(sfa, rootUrl):
  633.     ret = { }
  634.     contents = sfa.getFolderContents(rootUrl, True)
  635.     for i in contents:
  636.         if sfa.isFolder(i):
  637.             transientPathElement = lastElement(i)
  638.             subcontents = sfa.getFolderContents(i, True)
  639.             for j in subcontents:
  640.                 if sfa.isFolder(j):
  641.                     pathes = getPathesFromPackage(j, sfa)
  642.                     if len(pathes) > 0:
  643.                         if log.isErrorLevel():
  644.                             pass
  645.                         log.error('adding Package ' + transientPathElement + ' ' + str(pathes))
  646.                         ret[lastElement(j)] = Package(pathes, transientPathElement)
  647.                     
  648.                 len(pathes) > 0
  649.             
  650.     
  651.     return ret
  652.  
  653.  
  654. def lastElement(aStr):
  655.     return aStr[aStr.rfind('/') + 1:len(aStr)]
  656.  
  657.  
  658. class PackageBrowseNode(unohelper.Base, XBrowseNode):
  659.     
  660.     def __init__(self, provCtx, name, rootUrl):
  661.         self.provCtx = provCtx
  662.         self.name = name
  663.         self.rootUrl = rootUrl
  664.  
  665.     
  666.     def getName(self):
  667.         return self.name
  668.  
  669.     
  670.     def getChildNodes(self):
  671.         items = self.provCtx.mapPackageName2Path.items()
  672.         browseNodeList = []
  673.         for i in items:
  674.             if len(i[1].pathes) == 1:
  675.                 browseNodeList.append(DirBrowseNode(self.provCtx, i[0], i[1].pathes[0]))
  676.                 continue
  677.             for j in i[1].pathes:
  678.                 browseNodeList.append(DirBrowseNode(self.provCtx, i[0] + '.' + lastElement(j), j))
  679.             
  680.         
  681.         return tuple(browseNodeList)
  682.  
  683.     
  684.     def hasChildNodes(self):
  685.         return len(self.mapPackageName2Path) > 0
  686.  
  687.     
  688.     def getType(self):
  689.         return CONTAINER
  690.  
  691.     
  692.     def getScript(self, uri):
  693.         log.debug('DirBrowseNode getScript ' + uri + ' invoked')
  694.         raise IllegalArgumentException("PackageBrowseNode couldn't instantiate script " + uri, self, 0)
  695.  
  696.  
  697.  
  698. class PythonScript(unohelper.Base, XScript):
  699.     
  700.     def __init__(self, func, mod):
  701.         self.func = func
  702.         self.mod = mod
  703.  
  704.     
  705.     def invoke(self, args, out, outindex):
  706.         if log.isDebugLevel():
  707.             pass
  708.         log.debug('PythonScript.invoke ' + str(args))
  709.         
  710.         try:
  711.             ret = self.func(*args)
  712.         except UnoException:
  713.             e = None
  714.             text = lastException2String()
  715.             complete = 'Error during invoking function ' + str(self.func.__name__) + ' in module ' + self.mod.__file__ + ' (' + text + ')'
  716.             if log.isDebugLevel():
  717.                 pass
  718.             log.debug(complete)
  719.             e.Message = e.Message + ' (' + complete + ')'
  720.             raise 
  721.         except Exception:
  722.             e = None
  723.             text = lastException2String()
  724.             complete = 'Error during invoking function ' + str(self.func.__name__) + ' in module ' + self.mod.__file__ + ' (' + text + ')'
  725.             if log.isDebugLevel():
  726.                 pass
  727.             log.debug(complete)
  728.             raise RuntimeException(complete, self)
  729.  
  730.         if log.isDebugLevel():
  731.             pass
  732.         log.debug('PythonScript.invoke ret = ' + str(ret))
  733.         return (ret, (), ())
  734.  
  735.  
  736.  
  737. def expandUri(uri):
  738.     if uri.startswith('vnd.sun.star.expand:'):
  739.         uri = uri.replace('vnd.sun.star.expand:', '', 1)
  740.         uri = uno.getComponentContext().getByName('/singletons/com.sun.star.util.theMacroExpander').expandMacros(uri)
  741.     
  742.     return uri
  743.  
  744.  
  745. class PythonScriptProvider(unohelper.Base, XBrowseNode, XScriptProvider, XNameContainer):
  746.     
  747.     def __init__(self, ctx, *args):
  748.         if log.isDebugLevel():
  749.             mystr = ''
  750.             for i in args:
  751.                 if len(mystr) > 0:
  752.                     mystr = mystr + ','
  753.                 
  754.                 mystr = mystr + str(i)
  755.             
  756.             log.debug('Entering PythonScriptProvider.ctor' + mystr)
  757.         
  758.         storageType = ''
  759.         if isinstance(args[0], unicode):
  760.             storageType = args[0]
  761.         else:
  762.             storageType = args[0].SCRIPTING_DOC_URI
  763.         isPackage = storageType.endswith(':uno_packages')
  764.         
  765.         try:
  766.             urlHelper = ctx.ServiceManager.createInstanceWithArgumentsAndContext('com.sun.star.script.provider.ScriptURIHelper', (LANGUAGENAME, storageType), ctx)
  767.             if log.isDebugLevel():
  768.                 pass
  769.             log.debug('got urlHelper ' + str(urlHelper))
  770.             rootUrl = urlHelper.getRootStorageURI()
  771.             if log.isDebugLevel():
  772.                 pass
  773.             log.debug(storageType + ' transformed to ' + rootUrl)
  774.             ucbService = 'com.sun.star.ucb.SimpleFileAccess'
  775.             sfa = ctx.ServiceManager.createInstanceWithContext(ucbService, ctx)
  776.             if not sfa:
  777.                 log.debug("PythonScriptProvider couldn't instantiate " + ucbService)
  778.                 raise RuntimeException("PythonScriptProvider couldn't instantiate " + ucbService, self)
  779.             
  780.             self.provCtx = ProviderContext(storageType, sfa, urlHelper, ScriptContext(uno.getComponentContext(), None))
  781.             if isPackage:
  782.                 mapPackageName2Path = getPackageName2PathMap(sfa, rootUrl)
  783.                 self.provCtx.setPackageAttributes(mapPackageName2Path, rootUrl)
  784.                 self.dirBrowseNode = PackageBrowseNode(self.provCtx, LANGUAGENAME, rootUrl)
  785.             else:
  786.                 self.dirBrowseNode = DirBrowseNode(self.provCtx, LANGUAGENAME, rootUrl)
  787.         except Exception:
  788.             e = None
  789.             text = lastException2String()
  790.             log.debug('PythonScriptProvider could not be instantiated because of : ' + text)
  791.             raise e
  792.  
  793.  
  794.     
  795.     def getName(self):
  796.         return self.dirBrowseNode.getName()
  797.  
  798.     
  799.     def getChildNodes(self):
  800.         return self.dirBrowseNode.getChildNodes()
  801.  
  802.     
  803.     def hasChildNodes(self):
  804.         return self.dirBrowseNode.hasChildNodes()
  805.  
  806.     
  807.     def getType(self):
  808.         return self.dirBrowseNode.getType()
  809.  
  810.     
  811.     def getScript(self, uri):
  812.         log.debug('DirBrowseNode getScript ' + uri + ' invoked')
  813.         raise IllegalArgumentException("DirBrowseNode couldn't instantiate script " + uri, self, 0)
  814.  
  815.     
  816.     def getScript(self, scriptUri):
  817.         
  818.         try:
  819.             if log.isDebugLevel():
  820.                 pass
  821.             log.debug('getScript ' + scriptUri + ' invoked')
  822.             storageUri = self.provCtx.getStorageUrlFromPersistentUrl(self.provCtx.uriHelper.getStorageURI(scriptUri))
  823.             if log.isDebugLevel():
  824.                 pass
  825.             log.debug('getScript: storageUri = ' + storageUri)
  826.             fileUri = storageUri[0:storageUri.find('$')]
  827.             funcName = storageUri[storageUri.find('$') + 1:len(storageUri)]
  828.             mod = self.provCtx.getModuleByUrl(fileUri)
  829.             if log.isDebugLevel():
  830.                 pass
  831.             log.debug(' got mod ' + str(mod))
  832.             func = mod.__dict__[funcName]
  833.             if log.isDebugLevel():
  834.                 pass
  835.             log.debug('got func ' + str(func))
  836.             return PythonScript(func, mod)
  837.         except Exception:
  838.             e = None
  839.             text = lastException2String()
  840.             log.error(text)
  841.             raise ScriptFrameworkErrorException(text, self, scriptUri, LANGUAGENAME, 0)
  842.  
  843.  
  844.     
  845.     def getSupportedServices(self):
  846.         return g_ImplementationHelper.getSupportedServices(g_implName)
  847.  
  848.     
  849.     def supportsService(self, ServiceName):
  850.         return g_ImplementationHelper.supportsService(g_implName, ServiceName)
  851.  
  852.     
  853.     def getImplementationName(self):
  854.         return g_implName
  855.  
  856.     
  857.     def getByName(self, name):
  858.         log.debug('getByName called' + str(name))
  859.  
  860.     
  861.     def getElementNames(self):
  862.         log.debug('getElementNames called')
  863.         return ()
  864.  
  865.     
  866.     def hasByName(self, name):
  867.         
  868.         try:
  869.             log.debug('hasByName called ' + str(name))
  870.             uri = expandUri(name)
  871.             ret = self.provCtx.isUrlInPackage(uri)
  872.             log.debug('hasByName ' + uri + ' ' + str(ret))
  873.             return ret
  874.         except Exception:
  875.             e = None
  876.             text = lastException2String()
  877.             log.debug('Error in hasByName:' + text)
  878.             return False
  879.  
  880.  
  881.     
  882.     def removeByName(self, name):
  883.         log.debug('removeByName called' + str(name))
  884.         uri = expandUri(name)
  885.         self.provCtx.removePackageByUrl(uri)
  886.         log.debug('removeByName called' + str(uri) + ' successful')
  887.  
  888.     
  889.     def insertByName(self, name, value):
  890.         log.debug('insertByName called ' + str(name) + ' ' + str(value))
  891.         uri = expandUri(name)
  892.         self.provCtx.addPackageByUrl(uri)
  893.         log.debug('insertByName called' + str(uri) + ' successful')
  894.  
  895.     
  896.     def replaceByName(self, name, value):
  897.         log.debug('replaceByName called ' + str(name) + ' ' + str(value))
  898.         removeByName(name)
  899.         insertByName(name)
  900.         log.debug('replaceByName called' + str(uri) + ' successful')
  901.  
  902.     
  903.     def getElementType(self):
  904.         log.debug('getElementType called')
  905.         return uno.getTypeByName('void')
  906.  
  907.     
  908.     def hasElements(self):
  909.         log.debug('hasElements got called')
  910.         return False
  911.  
  912.  
  913. g_ImplementationHelper.addImplementation(PythonScriptProvider, g_implName, ('com.sun.star.script.provider.LanguageScriptProvider', 'com.sun.star.script.provider.ScriptProviderFor' + LANGUAGENAME))
  914. log.debug('pythonscript finished intializing')
  915.